package com.sybil.ot.dominio;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "SIL_DETALLE_HISTORICO_FLUJO")
public class DetalleSolicitud implements Serializable {

   private static final long serialVersionUID = 1L;
   protected DetalleSolicitudPK llave;
   private int instancia;
   private Date fecha;
   private String comentarios;
   private Solicitud solicitud;
   private Evento evento;
   private Usuario usuario;
   private Causa causa;
   private String usuarioCreo;
   private String usuarioModif;
   private List<Correo> correos;
   private String clavePaso;
   private String claveEvento;

   public DetalleSolicitud() {
   }

   public DetalleSolicitud(DetalleSolicitudPK llave) {
      this.llave = llave;
   }

   public DetalleSolicitud(String claveFlujo, int numeroSolicitud, int numeroDetalle) {
      this.llave = new DetalleSolicitudPK(claveFlujo, numeroSolicitud, numeroDetalle);
   }

   public DetalleSolicitud(DetalleSolicitudPK llave, int instancia, Date fecha, String comentarios) {
      this.llave = llave;
      this.instancia = instancia;
      this.fecha = fecha;
      this.comentarios = comentarios;
   }

   @EmbeddedId
   public DetalleSolicitudPK getLlave() {
      return llave;
   }

   public void setLlave(DetalleSolicitudPK llave) {
      this.llave = llave;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "DEHF_INSTANCIA")
   public int getInstancia() {
      return instancia;
   }

   public void setInstancia(int instancia) {
      this.instancia = instancia;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "DEHF_FECHA")
   @Temporal(TemporalType.TIMESTAMP)
   public Date getFecha() {
      return fecha;
   }

   public void setFecha(Date fecha) {
      this.fecha = fecha;
   }

   @Size(max = 500)
   @Column(name = "DEHF_COMENTARIOS")
   public String getComentarios() {
      return comentarios;
   }

   public void setComentarios(String comentarios) {
      this.comentarios = comentarios;
   }

   @Basic(optional = false)
   @Column(name = "DEHF_USUARIO_CREO")
   public String getUsuarioCreo() {
      return usuarioCreo;
   }

   public void setUsuarioCreo(String usuarioCreo) {
      this.usuarioCreo = usuarioCreo;
   }

   @Column(name = "DEHF_USUARIO_MODIF")
   public String getUsuarioModif() {
      return usuarioModif;
   }

   public void setUsuarioModif(String usuarioModif) {
      this.usuarioModif = usuarioModif;
   }

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "detalleSolicitud")
   public List<Correo> getCorreos() {
      return correos;
   }

   public void setCorreos(List<Correo> correos) {
      this.correos = correos;
   }

   @JoinColumn(name = "DEHF_USPE_CLAVE", referencedColumnName = "USPE_CLAVE")
   @ManyToOne(optional = false)
   public Usuario getUsuario() {
      return usuario;
   }

   public void setUsuario(Usuario usuario) {
      this.usuario = usuario;
   }

   @JoinColumns({
      @JoinColumn(name = "DEHF_FLUJ_CLAVE", referencedColumnName = "HIFL_FLUJ_CLAVE", nullable = false, insertable = false, updatable = false),
      @JoinColumn(name = "DEHF_HIFL_NUMERO", referencedColumnName = "HIFL_NUMERO", nullable = false, insertable = false, updatable = false)})
   @ManyToOne(optional = false)
   public Solicitud getSolicitud() {
      return solicitud;
   }

   public void setSolicitud(Solicitud solicitud) {
      this.solicitud = solicitud;
   }

   @JoinColumns({
      @JoinColumn(name = "DEHF_FLUJ_CLAVE", referencedColumnName = "EVFL_FLUJ_CLAVE", nullable = false, insertable = false, updatable = false),
      @JoinColumn(name = "DEHF_PAFL_CLAVE", referencedColumnName = "EVFL_PAFL_ORIGEN", nullable = false, insertable = false, updatable = false),
      @JoinColumn(name = "DEHF_EVFL_CLAVE", referencedColumnName = "EVFL_CLAVE", nullable = false, insertable = false, updatable = false)})
   @ManyToOne(optional = false)
   public Evento getEvento() {
      return evento;
   }

   public void setEvento(Evento evento) {
      if (evento != null) {
         this.clavePaso = evento.getLlave().getClavePaso();
         this.claveEvento = evento.getLlave().getClaveEvento();
      }
      this.evento = evento;
   }

   @Column(name = "DEHF_PAFL_CLAVE")
   public String getClavePaso() {
      return clavePaso;
   }

   public void setClavePaso(String clavePaso) {
      this.clavePaso = clavePaso;
   }

   @Column(name = "DEHF_EVFL_CLAVE")
   public String getClaveEvento() {
      return claveEvento;
   }

   public void setClaveEvento(String claveEvento) {
      this.claveEvento = claveEvento;
   }

   @JoinColumn(name = "DEHF_CAFL_CLAVE", referencedColumnName = "CAFL_CLAVE")
   @ManyToOne
   public Causa getCausa() {
      return causa;
   }

   public void setCausa(Causa causa) {
      this.causa = causa;
   }

   @Override
   public int hashCode() {
      int hash = 0;
      hash += (llave != null ? llave.hashCode() : 0);
      return hash;
   }

   @Override
   public boolean equals(Object object) {
      if (!(object instanceof DetalleSolicitud)) {
         return false;
      }
      DetalleSolicitud other = (DetalleSolicitud) object;
      if ((this.llave == null && other.llave != null) || (this.llave != null && !this.llave.equals(other.llave))) {
         return false;
      }
      return true;
   }

   @Override
   public String toString() {
      return "DetalleSolicitud[ llave=" + llave + " ]";
   }
}
